/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import bean.Autor;
import bean.Significado;
import bean.Verbete;
import java.io.Serializable;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author fernando
 */
public class SignificadoDao implements Serializable {

    private Conexao conexao;
    private PreparedStatement ps;
    private boolean sucess = false;

    {
        this.conexao = new ConexaoPostgres();

    }

    public boolean cadastrarSignificado(Verbete verbete, Significado significado) {
        sucess = false;
        try {
            System.out.println("Significado DAO - CadastrarSignificado -Verbete: " + verbete.getTitulo() + verbete.getId());
            ps = conexao.getConnection().prepareStatement("INSERT INTO significado (significado, data) VALUES (?, ?) ");

            ps.setString(1, significado.getSignificado());
            Date data = new Date(significado.getData().getTime());
            ps.setDate(2, data);

            ps.executeUpdate();
            conexao.closeConnection();

            SignificadoDao sd = new SignificadoDao();
            significado.setId(sd.consultarSignificado(significado).getId());

            ps = conexao.getConnection().prepareStatement("INSERT INTO verbete_significado (id_verbete, id_significado) VALUES (?, ?) ");
            ps.setInt(1, verbete.getId());
            ps.setInt(2, significado.getId());

            ps.executeUpdate();
            conexao.closeConnection();



            Iterator it = significado.getAutores().iterator();
            int posicao = 1;
            while (it.hasNext()) {
                ps = conexao.getConnection().prepareStatement("INSERT INTO significado_autor (id_autor, id_significado, posicao) VALUES ( ?, ?, ?) ");
                Autor a = (Autor) it.next();

                ps.setInt(1, a.getId());
                ps.setInt(2, significado.getId());
                ps.setInt(3, posicao);
                posicao++;
                ps.executeUpdate();
                conexao.closeConnection();

            }
            sucess = true;
        } catch (SQLException ex) {
            conexao.closeConnection();
            Logger.getLogger(InstituicaoDao.class.getName()).log(Level.SEVERE, null, ex);
            return sucess;
        }
        conexao.closeConnection();
        return sucess;
    }

    public boolean alterarSignificado(Significado significado) {
        sucess = false;

        try {
            ps = conexao.getConnection().prepareStatement("UPDATE significado SET significado = ?, data = ? WHERE id = ? ");

            ps.setString(1, significado.getSignificado());
            Date data = new Date(significado.getData().getTime());
            ps.setDate(2, data);
            ps.setInt(3, significado.getId());

            ps.executeUpdate();
            conexao.closeConnection();

            ps = conexao.getConnection().prepareStatement("DELETE FROM significado_autor WHERE id_significado = ?");
            ps.setInt(1, significado.getId());
            ps.executeUpdate();
            conexao.closeConnection();


            Iterator it = significado.getAutores().iterator();
            int posicao = 1;
            while (it.hasNext()) {
                ps = conexao.getConnection().prepareStatement("INSERT INTO significado_autor (id_autor, id_significado, posicao) VALUES ( ?, ?, ?) ");
                Autor a = (Autor) it.next();
                System.out.println("Autor Adicionado: " + a.getUltimoNome() + a.getRestanteNome() + a.getId());
                System.out.println("Significado id: " + significado.getId());
                ps.setInt(1, a.getId());
                ps.setInt(2, significado.getId());
                ps.setInt(3, posicao);
                posicao++;
                ps.executeUpdate();
                conexao.closeConnection();
            }

            sucess = true;
        } catch (SQLException ex) {
            ex.printStackTrace();
            conexao.closeConnection();
            return sucess;
        }


        conexao.closeConnection();
        return sucess;
    }

    public Significado consultarSignificado(Significado significado) {



        try {
            System.out.println("Significado Dao - ConsultarSignificado" + significado.getSignificado());
            ps = conexao.getConnection().prepareStatement("SELECT * FROM significado WHERE significado = ? ");
            ps.setString(1, significado.getSignificado());
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();


            if (rs.next()) {

                significado.setId(rs.getInt("id"));
                System.out.println("Significado Dao - Descobrir id Significado - Encontrado! = " + significado.getId());

                return significado;

            }
        } catch (SQLException ex) {
            conexao.closeConnection();
            significado.setId(-1);
            return significado;

        }
        System.out.println("Significado Dao - Descobrir id significado - Não encontrou o significado!");

        significado.setId(-1); //-1 codigo para livro não encontrado!
        conexao.closeConnection();
        return significado;
    }

    public Significado consultarSiginificadoID(int id) {
        Significado s = new Significado();
        try {
            ps = conexao.getConnection().prepareStatement("SELECT * FROM significado WHERE id = ? ");
            ps.setInt(1, id);
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();

            if (rs.next()) {
                System.out.println("Significado Dao - buscar dados Significados - Encontrado! ");
                s.setId(id);
                s.setSignificado(rs.getString("significado"));
                s.setData(rs.getDate("data"));
                s.setAutores(this.buscarAutoresSignificado(s));

                return s;

            }
        } catch (SQLException ex) {
            conexao.closeConnection();
            s.setId(-1);
            return s;

        }
        System.out.println("Significado Dao - Descobrir id significado - Não encontrou o significado!");

        s.setId(-1); //-1 codigo para livro não encontrado!
        conexao.closeConnection();
        return s;

    }

    public ArrayList<Autor> buscarAutoresSignificado(Significado significado) {

        try {
            System.out.println("Busca Autores Significado - ID Significado :  " + significado.getId());
            ps = conexao.getConnection().prepareStatement("SELECT * FROM significado_autor WHERE id_significado = ? Order By posicao ");

            ps.setInt(1, significado.getId());
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();


            while (rs.next()) {
                System.out.println("Significado Dao - buscar autores - Encontrado! = ");
                AutorDao ad = new AutorDao();
                significado.addAutor(ad.consultaAutor(rs.getInt("id_autor")));

            }


        } catch (SQLException ex) {
            conexao.closeConnection();
            significado.setId(-1);
            return significado.getAutores();

        }

        conexao.closeConnection();
        return significado.getAutores();

    }

    public boolean removerSignificado(Verbete verbete, Significado significado) {
        sucess = false;
        try {
            System.out.println("Significado DAO - CadastrarSignificado -Verbete: " + verbete.getTitulo() + verbete.getId());


            ps = conexao.getConnection().prepareStatement("DELETE FROM significado_autor WHERE id_significado = ? ");

            ps.setInt(1, significado.getId());
            ps.executeUpdate();
            conexao.closeConnection();


            ps = conexao.getConnection().prepareStatement("DELETE FROM verbete_significado WHERE id_significado = ? ");

            ps.setInt(1, significado.getId());
            ps.executeUpdate();
            conexao.closeConnection();

            ps = conexao.getConnection().prepareStatement("DELETE FROM significado WHERE id = ? ");

            ps.setInt(1, significado.getId());
            ps.executeUpdate();
            conexao.closeConnection();
            sucess = true;

        } catch (SQLException ex) {
            conexao.closeConnection();
            Logger.getLogger(InstituicaoDao.class.getName()).log(Level.SEVERE, null, ex);
            return sucess;
        }
        conexao.closeConnection();
        return sucess;
    }

    public boolean validarSignificado(Significado s) {
        sucess = false;
        try {
            ps = conexao.getConnection().prepareStatement("SELECT id FROM significado WHERE significado = ? ");
            ps.setString(1, s.getSignificado());
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
            if(rs.next()){
                return sucess;
            }else{
                sucess = true;
            }
        } catch (SQLException ex) {
            Logger.getLogger(SignificadoDao.class.getName()).log(Level.SEVERE, null, ex);
        }


        return sucess;


    }
}
